package practica1.manejoExperimento;

import es.miguelgonzalez.jgraficacomida.JGraficaComidaDibujo;
import es.miguelgonzalez.jgraficacomida.JGraficaComidaModel;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.write.*;
import practica1.Practica1;
import practica1.language.Language;
import practica1.logic.LogicExperimento;
import practica1.logic.LogicPoblacion;
import practica1.ui.tablaPoblacion.ModeloPoblacionTabla;

/**
 * Clase que permite exportar un experimento a excel
 * @author Miguel González - Ceura
 */
public class ExportarExperimentoExcel {
    /**
     * Método estático que exporta el experimento a excel
     * @param experimento LogicExperimento a exportar
     * @throws ExperimentoInvalidoException Lanza un error si no se pudo exportar
     */
    public static void exportarExcel(LogicExperimento experimento)
            throws ExperimentoInvalidoException {
        try {
            OutputStream output = new FileOutputStream(experimento.
                    getFichExperimento().getParent() + "/" +
                    experimento.getNombreExperimento() + ".xls", false);
            WritableWorkbook workbook = Workbook.createWorkbook(output);
            
            ArrayList<LogicPoblacion> poblaciones =
                    experimento.getPoblaciones();
            
            //Estilo centrado y con subrayado
            WritableCellFormat wcf1 = new WritableCellFormat();
            wcf1.setAlignment(Alignment.CENTRE);
            wcf1.setBorder(jxl.format.Border.BOTTOM,
                    jxl.format.BorderLineStyle.MEDIUM_DASHED,
                    jxl.format.Colour.GRAY_80);
            
            //Estilo centrado y con bordes
            WritableCellFormat wcf2 = new WritableCellFormat();
            wcf2.setAlignment(Alignment.CENTRE);
            wcf2.setBorder(jxl.format.Border.ALL,
                    jxl.format.BorderLineStyle.DOTTED,
                    jxl.format.Colour.GRAY_80);
            
            //Primera página que contiene los datos del experimento
            WritableSheet sheetP = workbook.createSheet(
                        experimento.getNombreExperimento(), 1);
            
            sheetP.setColumnView(1, 25); //Establecemos el ancho de la columna 1
            sheetP.setColumnView(2, 20);
            
            //new Label(Columna, Fila, Texto)
            sheetP.addCell(new Label(1, 2, 
                    Language.getI().getP("NOMBRE_EXPERIMENTO")));
            sheetP.addCell(new Label(2, 2, experimento.getNombreExperimento()));
            
            sheetP.addCell(new Label(1, 3, 
                    Language.getI().getP("TIPO_BACTERIA")));
            sheetP.addCell(new Label(2, 3, experimento.getTipoBacteria()));
            
            sheetP.addCell(new Label(1, 4, 
                    Language.getI().getP("NOMBRE_INVESTIGADOR")));
            sheetP.addCell(new Label(2, 4, experimento.getNombreInvestigador()));
            
            sheetP.addCell(new Label(1, 5, 
                    Language.getI().getP("PROYECTO_INVESTIGACION")));
            sheetP.addCell(new Label(2, 5, experimento.getProyectoInvestigacion()));
            
            //Empezamos las poblaciones en la segunda página
            int contadorPagina = 2;
            for(LogicPoblacion poblacion : poblaciones) {
                WritableSheet sheet = workbook.createSheet(
                        poblacion.getNombrePoblacion(), contadorPagina); 
                
                //Establecemos los anchos de las columnas
                sheet.setColumnView(1, 18);
                sheet.setColumnView(2, 18);
                sheet.setColumnView(3, 18);
                sheet.setColumnView(4, 18);
                sheet.setColumnView(5, 18);
                
                //Datos generales de la población
                //Columna , Fila, Dato
                sheet.mergeCells(2, 2, 4, 2);
                sheet.addCell(new Label(2, 2, poblacion.getNombrePoblacion(), wcf1)); 
                
                sheet.addCell(new Label(1, 4, 
                        Language.getI().getP("FECHA") + ": "));
                sheet.addCell(new Label(2, 4, poblacion.getFecha()));
                
                sheet.addCell(new Label(1, 5, 
                        Language.getI().getP("TAMANIO") + ": ")); 
                sheet.addCell(new Label(2, 5, ""+poblacion.getTamanioPoblacion())); 
                
                sheet.addCell(new Label(1, 6, 
                        Language.getI().getP("LUMINOSIDAD") + ": ")); 
                sheet.addCell(new Label(2, 6, poblacion.getLuminosidad()));
                
                sheet.addCell(new Label(1, 7, 
                        Language.getI().getP("TEMPERATURA") + ": "));
                sheet.addCell(new Label(2, 7, poblacion.getTemperatura() +
                        poblacion.getEscalaTemperatura()));
                
                //Modelo de la gráfica
                sheet.mergeCells(2, 9, 4, 9);
                sheet.addCell(new Label(2, 9, 
                        Language.getI().getP("ALIMENTACION"), wcf1));
                JGraficaComidaModel grafica = poblacion.getModeloGraficaComida();
                
                sheet.addCell(new Label(1, 12, 
                        Language.getI().getP("ALIMENTACION_INICIAL") + ": "));
                sheet.addCell(new Label(2, 12, ""+grafica.getAlimentoInicial()));
                
                sheet.addCell(new Label(1, 13, 
                        Language.getI().getP("ALIMENTACION_MAXIMA") + ": "));
                sheet.addCell(new Label(2, 13, ""+grafica.getAlimentoMax()));
                
                sheet.addCell(new Label(1, 14, 
                        Language.getI().getP("DIA_MAXIMO") + ": "));
                sheet.addCell(new Label(2, 14, ""+grafica.getDiaMax()));
                
                sheet.addCell(new Label(1, 15, 
                        Language.getI().getP("ALIMENTACION_FINAL") + ": "));
                sheet.addCell(new Label(2, 15, ""+grafica.getAlimentoMax()));
                
                //Gráfica de la población
                
                BufferedImage imgGrafica = new BufferedImage(300, 200,
                    BufferedImage.TYPE_INT_RGB);
                JGraficaComidaDibujo jGrafica = new JGraficaComidaDibujo(grafica);
                jGrafica.setSize(300,200);
                
                Graphics g = imgGrafica.getGraphics();
                jGrafica.paint(g);
                
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                ImageIO.write( imgGrafica, "jpg", baos );
                baos.flush();
                byte[] imageInByte = baos.toByteArray();
                baos.close();
                
                WritableImage wi = new WritableImage
                    (3, 11, 3, 7, imageInByte);
                sheet.addImage(wi);
                
                //Tabla
                sheet.mergeCells(2, 18, 4, 18);
                sheet.addCell(new Label(2, 18, 
                        Language.getI().getP("TABLA"), wcf1));
                ModeloPoblacionTabla tabla = poblacion.
                        getModeloPoblacionTabla();
                
                //Cabecera de la tabla
                sheet.addCell(new Label(1, 20, 
                        Language.getI().getP("DIA"), wcf2));
                sheet.addCell(new Label(2, 20, 
                        Language.getI().getP("TAMANIO"), wcf2));
                sheet.addCell(new Label(3, 20, 
                        Language.getI().getP("BACTERIAS_MUERTAS"), wcf2));
                sheet.addCell(new Label(4, 20, 
                        Language.getI().getP("TEMPERATURA"), wcf2));
                sheet.addCell(new Label(5, 20, 
                        Language.getI().getP("DOSIS_COMIDA"), wcf2));
                
                //Datos de la tabla
                for(int i=0; i<30; i++) {
                    sheet.addCell(new Label(1, 21 + i,
                            (String)tabla.getValueAt(i, 0), wcf2));
                    sheet.addCell(new Label(2, 21 + i,
                            (String)tabla.getValueAt(i, 1), wcf2));
                    sheet.addCell(new Label(3, 21 + i,
                            (String)tabla.getValueAt(i, 2), wcf2));
                    sheet.addCell(new Label(4, 21 + i,
                            (String)tabla.getValueAt(i, 3), wcf2));
                    sheet.addCell(new Label(5, 21 + i,
                            (String)tabla.getValueAt(i, 4), wcf2));
                }
                
                contadorPagina++;
            }
            
            workbook.write();
            workbook.close(); 
        } catch (WriteException ex) {
            Practica1.log.error(Language.getI().getP("ERROR"), ex);
            throw new ExperimentoInvalidoException(ex);
        } catch(IOException ex) {
            Practica1.log.error(Language.getI().getP("ERROR"), ex);
            throw new ExperimentoInvalidoException(ex);
        }
    }
}
